package com.company.anr.gettime;

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 获取 IoT 平台“上传时间”的小工具（仅放在 test/gettime 包中，不影响现有代码）。
 * 使用与现有代码一致的连接方式：复用 127.0.0.1:9222 的 Chrome 调试实例。
 * 步骤：登录 -> 打开错误日志页 -> 在搜索框输入 SN -> 点击搜索 -> 读取第一行对应的“上传时间”。
 */
public class UploadTimeFetcher {

    // 与现有后端代码保持一致的地址
    private static final String LOGIN_URL = "https://iot-admin.zuoyebang.cc/iot-admin-server/index";
    private static final String ERROR_LOG_URL = "https://iot-admin.zuoyebang.cc/iot-admin-server/system/errorlog/table";

    private static final Duration DEFAULT_WAIT = Duration.ofSeconds(20);

    private WebDriver driver;
    private WebDriverWait wait;

    /**
     * 连接到已经用调试端口启动的 Chrome（127.0.0.1:9222）。
     */
    public void initWithExistingChrome() {
        System.setProperty("webdriver.chrome.driver", "C\\\\Windows\\\\chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
        options.addArguments("--disable-blink-features=AutomationControlled");
        options.addArguments("--disable-extensions");
        options.addArguments("--no-sandbox");
        options.addArguments("--disable-dev-shm-usage");

        this.driver = new ChromeDriver(options);
        this.driver.manage().window().maximize();
        this.wait = new WebDriverWait(driver, DEFAULT_WAIT);
    }

    /**
     * 登录（占位符与现有代码一致：邮箱前缀/密码）。
     */
    public void login(String username, String password) {
        driver.get(LOGIN_URL);
        sleep(3000);
        WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(30));
        longWait.until(ExpectedConditions.presenceOfElementLocated(By.className("el-input__inner")));

        // 使用占位符定位输入框（与现有实现保持一致）
        driver.findElement(By.xpath("//input[@placeholder='请输入邮箱前缀']")).sendKeys(username);
        driver.findElement(By.xpath("//input[@placeholder='请输入密码']")).sendKeys(password);
        // 点击登录按钮（页面上是一个普通 button[type=button]）
        driver.findElement(By.cssSelector("button[type='button']")).click();
        sleep(3000);
    }

    /**
     * 在错误日志页搜索 SN（复用现有 XPath）。
     */
    public void searchBySn(String deviceSn) {
        driver.get(ERROR_LOG_URL);
        // 等待页面基本加载
        sleep(2000);

        // 第二个搜索输入框：//*[@id="form-search"]/div/ul/li[1]/input
        WebElement secondSnInput = driver.findElement(By.xpath("//*[@id=\"form-search\"]/div/ul/li[1]/input"));

        secondSnInput.clear();
        secondSnInput.sendKeys(deviceSn);

        // 点击搜索按钮：//*[@id="form-search"]/div/ul/li[2]/a[1]
        wait.until(ExpectedConditions
                .elementToBeClickable(By.xpath("//*[@id=\"form-search\"]/div/ul/li[2]/a[1]"))).click();

        // 等待表格首行出现
        wait.until(ExpectedConditions.presenceOfElementLocated(
                By.xpath("//*[@id='bootstrap-table']/tbody/tr[1]")
        ));
        // 再等一下，确保数据完全渲染
        sleep(1000);
    }

    /**
     * 提取第一行的“上传时间”。优先通过表头文本定位列索引，找不到则按时间格式回退匹配。
     */
    public String fetchFirstRowUploadTime() {
        // 1) 根据表头定位“上传时间”的列索引（1-based）
        Integer colIndex = findUploadTimeColumnIndex();

        if (colIndex != null) {
            WebElement cell = driver.findElement(By.xpath("//*[@id='bootstrap-table']/tbody/tr[1]/td[" + colIndex + "]"));
            String text = cell.getText().trim();
            if (!text.isEmpty()) {
                return text;
            }
        }

        // 2) 回退：扫描第一行所有单元格，找符合 yyyy-MM-dd HH:mm:ss 的文本
        List<WebElement> cells = driver.findElements(By.xpath("//*[@id='bootstrap-table']/tbody/tr[1]/td"));
        Pattern p = Pattern.compile("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}");
        for (WebElement c : cells) {
            String t = c.getText();
            if (t != null) {
                Matcher m = p.matcher(t);
                if (m.find()) {
                    return m.group();
                }
            }
        }
        return null;
    }

    private Integer findUploadTimeColumnIndex() {
        try {
            List<WebElement> headers = driver.findElements(By.xpath("//*[@id='bootstrap-table']/thead//th"));
            int idx = 0;
            for (int i = 0; i < headers.size(); i++) {
                String txt = headers.get(i).getText();
                // 有些表头可能带空格/换行，统一去空白比较
                if (txt != null && txt.replace(" ", "").contains("上传时间")) {
                    idx = i + 1; // XPath 1-based
                    break;
                }
            }
            return idx == 0 ? null : idx;
        } catch (NoSuchElementException e) {
            return null;
        }
    }

    public void close() {
        if (driver != null) {
            try { driver.quit(); } catch (Exception ignored) {}
        }
    }

    private static void sleep(long ms) {
        try { Thread.sleep(ms); } catch (InterruptedException ignored) { Thread.currentThread().interrupt(); }
    }

    /**
     * 便于本地快速试跑：
     * 运行前请先执行 start-chrome-debug.bat 以启动 Chrome 调试端口。
     * 传参顺序：用户名 密码 SN
     */
    public static void main(String[] args) {
        if (args == null || args.length < 3) {
            System.out.println("用法: UploadTimeFetcher <username> <password> <sn>");
            return;
        }
        String username = args[0];
        String password = args[1];
        String sn = args[2];

        UploadTimeFetcher f = new UploadTimeFetcher();
        try {
            f.initWithExistingChrome();
            f.login(username, password);
            f.searchBySn(sn);
            String time = f.fetchFirstRowUploadTime();
            System.out.println("上传时间: " + time);
        } finally {
            f.close();
        }
    }
}

